/**
在TypeScript中，对象类型的修饰符用于定义对象的结构和行为，主要包括以下几种类型修饰符：
  1. 可选属性修饰符
  - 使用问号  `?`  来表示某个属性是可选的，即该属性可以存在也可以不存在。
  - 例如：
  interface Person {
      name: string;
      age?: number;  // age 是可选属性
  }

  const person1: Person = { name: "张三" }; // 合法
  const person2: Person = { name: "李四", age: 30 }; // 合法
  2. 只读属性修饰符
  - 使用  `readonly`  关键字来定义只读属性，这意味着该属性只能在对象创建时赋值，之后不能被修改。
  - 例如：
  interface Point {
      readonly x: number;
      readonly y: number;
  }

  const point: Point = { x: 10, y: 20 };
  // point.x = 15; // 错误：不能修改只读属性
  3. 索引签名
  - 索引签名允许你定义具有动态属性的对象类型。可以使用字符串或数字作为索引。
  - 例如：
  interface StringArray {
      [index: number]: string; // 数字索引
  }

  const myArray: StringArray = ["hello", "world"];
  const str: string = myArray[0]; // 合法

  interface NumberDictionary {
      [key: string]: number; // 字符串索引
  }

  const myDict: NumberDictionary = { "one": 1, "two": 2 };
  4. 函数类型
  - 对象类型可以定义为函数类型，指定参数和返回值的类型。
  - 例如：
  interface SearchFunc {
      (source: string, subString: string): boolean;
  }

  const mySearch: SearchFunc = function(source: string, subString: string) {
      return source.includes(subString);
  };
  5. 交叉类型
  - 使用  `&`  运算符可以将多个类型合并为一个类型，称为交叉类型。
  - 例如：
  interface Person {
      name: string;
  }

  interface Employee {
      employeeId: number;
  }

  type EmployeePerson = Person & Employee;

  const emp: EmployeePerson = {
      name: "王五",
      employeeId: 12345,
  };
  6. 联合类型
  - 使用  `|`  运算符可以定义一个属性可以是多种类型中的一种，称为联合类型。
  - 例如：
  interface ID {
      id: number | string; // id 可以是数字或字符串
  }

  const userId: ID = { id: 123 }; // 合法
  const adminId: ID = { id: "admin" }; // 合法
  7. 总结
  TypeScript中的对象类型修饰符提供了灵活性和强大的类型系统，使得开发者可以定义复杂的对象结构。通过可选属性、只读属性、索引签名、函数类型、交叉类型和联合类型，能够更好地描述和控制对象的行为和形态，从而提高代码的可读性和可维护性。
 */

type IPerson = {
  name?: string; // 可选属性
  readonly age: number;  // 只读属性
}

interface IAdmin {
  name?: string;
  readonly age: number;
}

const person: IPerson = {
  name: 'curry',
  age: 18
}

// person.age = 20; // 报错

const admin: IAdmin = {
  name: 'kobe',
  age: 30
}

// admin.age = 40; // 报错